package com.hailiang.study.javase.java.util;

import org.junit.Test;

import java.util.HashMap;
import java.util.Map;


/**
 * merge方法定义如下：
 *      V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)
 * 说明：
 *      功能大部分与compute相同，不同之处在于BiFunction中apply的参数，BiFunction的入参为oldValue, value;
 *      调用merge时，根据两个value进行逻辑处理并返回value
 */
public class Map_merge {

    @Test
    public void test_merge_01() {
        Map<Integer, String> map = new HashMap<>();
        for (int i = 0; i < 5; i ++) {
            map.put(i, "val_" + i);
        }
        map.put(10, null);  // 放入null
        System.out.println(map);
        System.out.println("-------------------分割线-------------------------");


        System.out.println(map.merge(3, "val_m_3", (oldValue, newValue) -> "nv3")); // 返回nv3 -->> 由于key=3存在且value!=null，则用执行BiFunction处理的结果覆盖原来的value
        System.out.println(map.merge(10, "val_m_10", (oldValue, newValue) -> "nv10")); // 返回val_m_10 -->> 由于key=10存在且value=null，故使用value覆盖null
        System.out.println(map.merge(8, "88", (oldValue, newValue) -> "nv8"));
        System.out.println(map.merge(4, "44", (o, n) -> null)); // 删除key=4的节点 -->> 由于key=4存在且对应的value=val_4，则执行BiFunction处理的结果，由于结果值为null，则删除该节点
        System.out.println(map);
    }

}
